local base = _G
module("Library.LuaXML2.LuaXML2")

function parseargs(s)
	local arg = {}
	base.string.gsub(s, "(%w+)=([\"'])(.-)%2", function (w, _, a)
		arg[w] = a
	end)
	return arg
end
		
function collect(s)
	local stack = {}
	local top = {}
	base.table.insert(stack, top)
	local ni,c,label,xarg, empty
	local i, j = 1, 1
	while true do
		ni,j,c,label,xarg, empty = base.string.find(s, "<(%/?)([%w:]+)(.-)(%/?)>", i)
		if not ni then break end
		local text = base.string.sub(s, i, ni-1)
		if not base.string.find(text, "^%s*$") then
			base.table.insert(top, text)
		end
		if empty == "/" then	-- empty element tag
			base.table.insert(top, {label=label, xarg=parseargs(xarg), empty=1})
		elseif c == "" then	 -- start tag
			top = {label=label, xarg=parseargs(xarg)}
			base.table.insert(stack, top)	 -- new level
		else	-- end tag
			local toclose = base.table.remove(stack)	-- remove top
			top = stack[#stack]
			if #stack < 1 then
				error("nothing to close with "..label)
			end
			if toclose.label ~= label then
				error("trying to close "..toclose.label.." with "..label)
			end
			base.table.insert(top, toclose)
		end
		i = j+1
	end
	local text = base.string.sub(s, i)
	if not base.string.find(text, "^%s*$") then
		base.table.insert(stack[#stack], text)
	end
	if #stack > 1 then
		error("unclosed "..stack[stack.n].label)
	end
	return stack[1]
end
